package com.zmall.api.config;

import com.zmall.api.client.fallback.ItemClientFallback;
import com.zmall.common.utils.UserContext;
import feign.Logger;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
 * feign所包含的client的配置类，用于编写关于feign的配置
 * 如果一个服务需要诸如多重的usercontext传递等功能，务必需要启动此类于configuration中
 */
@Configuration
public class DefaultFeignConfig {
    /**
     * 用于调整日志的等级
     * 定义feign所输出的日志等级
     * @return
     */
    @Bean
    public Logger.Level loggerLevel() {
        return Logger.Level.FULL;
    }


    /**
     * 制作并且注册一个feign的拦截器
     * apply函数中定义了拦截器的内容
     * @return
     */
    @Bean
    public RequestInterceptor userInfoRequestInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) {
                // 获取登录用户
                Long userId = UserContext.getUser();
                if (userId == null) {
                    // 如果为空则直接跳过
                    return;
                }
                // 如果不为空则放入请求头中，传递给下游微服务
                template.header("user-info", userId.toString());
            }
        };
    }


    // 在此处，因为没有直接对ItemClientFallback进行component注解的标注，所以需要自行添加注入。
    @Bean
    ItemClientFallback itemClientFallback() {
        return new ItemClientFallback();
    }
}
